07. 标准库
Python 标准库简介
到目前为止,我们已经在 Python 中使用了内置类型、函数和语法。你所看到的语法都可以在 Python 解释器中使用,也可以将代码放入 Python 脚本中运行。Python 不仅作用齐全,而且功能强大,只有你想不到的,没有它完不成的,只要编程能力高,就可以充分发挥 Python 的作用!
程序员可以自己编写代码,而我们也有一些现成的代码可以解决常见的问题。我们将这些“现成的代码”称为 Python 标准库。
Python 标准库是大量强大编程工具的集合,可为你在 Python 中编程提供帮助。从网络到数学统计,Python 标准库为一系列常见的专业任务提供新的对象类型和函数。其他程序员编写好的代码被放入有用的“模块”(module)中,以供你在自己的代码中访问和使用。使用 Python 标准库中的模块可轻松访问和使用现有代码,极大提升了你的编程能力!
在本节中,我们将了解标准库及其使用方法,并分享我们最喜欢的模块。
导入模块
Python 标准库的各组成部分被称为
modules
(模块)。许多模块都只是 Python 文件,与你已经使用和编写过的 Python 脚本类似。为了使用模块中的代码,我们必须将其
import
(导入)到交互式解释器或我们自己的 Python 脚本中。
导入模块的语法很简单:
import package_name
。
>>> import math
将导入语句放在文件的顶部(每个导入语句占一行)。导入模块即可运行该文件中的代码。其中通常包含很多定义,一般不显示任何输出。运行代码将使模块的所有函数和对象类型可用。
例如,
math
有一个
factorial
(阶乘)函数。(该函数会得出一个正整数与所有小于该正整数的整数乘积;例如 4 的阶乘是 24,因为 4×3×2×1 = 24)
在上方的代码块中,我们已经使用
import math
导入了
math
模块。现在,为了使用
factorial
函数,我们需调用它,以模块名称
math
开始,然后是一个点符号 (
.
),最后是函数名
factorial()
。
>>> print(math.factorial(3))
6
Python 标准库为其每个模块提供了详细的文档,在使用模块时,请先阅读对应的文档。
这里是
math
模块的文档链接
。
可以在 Python 模块周刊 中了解新模块。
练习:求幂
现在你应该练习自己导入和使用
math
模块了。请在下方的练习中使用
math
模块来计算
e
的 3 次幂,并
print
答案。
你可以参考 math 模块文档 ,查找自己需要的函数!
Start Quiz:
# TODO: print e to the power of 3 using the math module
了解标准库
到目前为止,我们只见过 Python 标准库中的一个模块。这个模块十分实用,但我们还有很多其他模块。我们现在来看看整个 Python 标准库的文档,这是一个庞大的链接列表。在之前的课程内容中,我们探讨的大部分内容都与内置对象相关。(如你所知,使用前不需要
import
)。
在这个文档中,模块被根据用途分列成组。单击导航中的模块名称即可跳至对应的内容,文档中通常还包含示例代码,可供你随时进行测试。
在下面的练习中,请你输入解决每个问题的模块名称。请注意大小写!标准库中的每个模块都采用小写字母。
哪个模块? 1
QUESTION:
哪个模块可以提示当前时间和日期?
SOLUTION:
NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer
哪个模块? 2
QUESTION:
哪个模块具有更改当前工作目录的方法?
SOLUTION:
NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer
哪个模块? 3
QUESTION:
哪个模块可以将数据从逗号分隔符 (.csv) 文件读取到 Python 字典的每一行?
SOLUTION:
NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer
哪个模块? 4
QUESTION:
哪个模块有助于从 zip 文件解压所有文件?
SOLUTION:
NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer
哪个模块? 5
QUESTION:
哪个模块可表示代码运行时长?
SOLUTION:
NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer
其他导入方法与命名
到目前为止,我们已经学习了如何使用
import module_name
导入模块,并通过点符号获得该模块的所有函数和所有对象类。
而我们还有其他一些常见的导入方法:
如果你需要从模块中导入单个的函数或类,可使用:
>>> from module_name import object_name
例如:
>>> from collections import defaultdict
这
仅
可访问模块
collections
中的
defaultdict
,并通过
defaultdict
自身的名称(前面不用加模块名称)对其进行访问,假如你试图访问
collections
,或是调用
collections.defaultdict()
都会导致一个 NameError。
>>> collections
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'collections' is not defined
>>> collections.defaultdict()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'collections' is not defined
>>> defaultdict()
defaultdict(None, {})
从模块导入单个对象意味着只需要使用所需内容,而不需要使用点符号进行访问。
用逗号将对象隔开即可从模块中导入多个单独的对象:
>>> from collections import defaultdict, namedtuple
这种方法常用于从大型库中导入对象的情况。
导入一个模块并重新命名(通常取较短名称)
如需重命名模块,可以使用
as
:
>>> import module_name as different_name
例如:
>>> import multiprocessing as mp
如果模块的名称特别长,或与具有相同或相似名称的内容发生冲突,则可以重命名模块。请查看文档中的代码示例,因为这些代码通常拥有常用的标准缩写形式,如果你使用与其他人一致的缩写,会使代码更易读。
然后你可以通过自己指定的备用名称和常用点符号从模块访问对象:
>>> mp.cpu_count()
4
从模块导入单个项目并重命名
你可以组合前两个语法,从模块导入一个项目, 并 更改其名称:
from module_name import object_name as different_name
例如:
from csv import reader as csvreader
同样地,你可以仅通过新指定的名称直接访问该单独项目,而不需要点符号。如果你有多个对象,且其名称与命名空间中的不同包名称相同,这可能会派上用场。例如,你也许需要一个 csv reader 和一个 json reader —— 可以从它们各自的模块中导入这些 reader,并给出描述性的名称。
一种 不应该 用于导入的方法
你有可能会在别人的代码中发现一种导入方法,但你 不应该 使用这种方法:
from module_name import *
例如
from random import *
上面这段代码将单独从
random
模块导入
每个
对象,并允许你直接通过其名称进行访问。这里存在的问题是该模块可能包含很多对象,而每个对象都有一个名称。导入所有这些名称可能会覆盖你在程序中使用的其他名称,或可能被其他名称覆盖。
import *
也使你的合作伙伴无法找到导入对象的定义位置。能够搜索函数定义的读写器,却无法确定它的位置,也无法确定是哪个
import *
语句引入了函数。这些问题将导致严重混乱。
请勿使用
from module_name import *
进行导入!!
如果真的想使用
random
模块中的所有对象,请使用标准的
import random
语句,并通过点符号访问每个对象。
模块、包和名称
某些 Python 标准库中有很多模块!为了更好地管理代码,它们被分解成包(package)中的子模块(sub-module)。一个包只是一个包含子模块的模块,并通过常见的点符号指定子模块。
例如,
os
模块(用于处理文件系统,对每个操作系统都起作用)具有一个子模块 os.path,该子模块专用于处理路径名。子模块由包名称指定,并通过点符号与子模块名称隔开。
你可以使用代码
os.path
导入子模块,如:
>>> import os.path
然后可以按常见方式使用子模块中的对象:
>>> os.path.isdir('my_path')
False
但是,该导入语法将 只 适用于子模块 —— 你不能以此种方式从模块导入函数。
>>> import os.path.isdir
ImportError: No module named 'os.path.isdir'; 'os.path' is not a package
如果你想使用 os 模块的其他部分,你可以导入
os
,这样就可以访问
os.path
中的所有内容。
有时候在使用模块时,命名可能会出现混乱。例如,模块可能以其中一个重要的类或函数命名。在此种情况下,你需要仔细考虑导入语句:
>>> from datetime import datetime
上方代码从
datetime
模块中导入了
datetime
类。请注意,在此之后,使用
datetime
将表示
datetime
类,而不是模块。
从模块导入和访问
在本练习中,你将使用不同的方法从
random
模块导入和使用
random.randint()
函数。你的任务是将导入语句与随后调用函数的方式进行匹配。
你可以在自己的 Python 解释器中进行测试。但请注意,一旦导入语句,其将一直处于导入状态,直到通过
exit()
或
ctrl-D
(或者如果在 Windows 上使用
ctrl-Z
)退出交互式解释器。
QUIZ QUESTION: :
将导入语句与
random.randint()
的调用方式匹配。
ANSWER CHOICES:
导入语句 |
调用函数 |
---|---|
请勿使用该导入语句! |
|
|
|
|
|
|
|
|
SOLUTION:
导入语句 |
调用函数 |
---|---|
请勿使用该导入语句! |
|
|
|
|
|
|
|
|
我们最喜欢的模块
Python 标准库的模块有很多!为了帮助大家熟悉可用模块,我们列出了一些实用的 Python 标准库模块,以及这些模块的简介:
-
csv
:方便阅读和编写 csv 文件 -
collections
:常用数据类型的有用扩展,包括OrderedDict
、defaultdict
与namedtuple
-
random
:生成伪随机数,随机打乱顺序,选择随机项 -
string
:字符串功能的拓展。此模块还包含诸如string.digits
(一个包含所有有效数字字符的字符串)的有用字母集合。 -
re
:通过正则表达式匹配字符串模式 -
math
:一些标准的数学函数 -
os
:与操作系统交互 -
os.path
:操作路径名的os
子模块 -
sys
:直接使用 Python 解释器 -
json
:很适合阅读和编写 json 文件(适合网络工作)
我们希望以上内容能为大家提供帮助!
练习:密码生成器
请编写一个名为
generate_password()
的函数,该函数从一个具有单词的文件中随机选出三个词,并将它们连成一个字符串。提供的初始代码中已经具有读取文件数据的代码,大家需要根据这些内容构建密码。
Start Quiz:
# Use an import statement at the top
word_file = "words.txt"
word_list = []
#fill up the word_list
with open(word_file,'r') as words:
for line in words:
# remove white space and make everything lowercase
word = line.strip().lower()
# don't include words that are too long or too short
if 3 < len(word) < 8:
word_list.append(word)
# Add your function generate_password here
# It should return a string consisting of three random words
# concatenated together without spaces
# test your function
print(generate_password())
Alice
was
beginning
to
get
very
tired
of
sitting
by
her
sister
bank
having
nothing
Once
twice
she
had
peeped
into
the
book
her
sister
was
reading
but
it
had
no
pictures
or
conversations
in
it
and
what
is
the
use
of
a
book
thought
Alice
without
pictures
or
conversations